package com.sisgesbyte.web.managedBean.mantenimiento.menu;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.sistema.MantenimientoMenu;
import com.sisgesbyte.services.sistema.bean.ListaMenuResponse;
import com.sisgesbyte.services.sistema.bean.MenuBean;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class MenuMantenimientoBean extends MantenimientoAbstract implements
		Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private MantenimientoMenu mantenimientoMenu;
	@Inject
	private Validaciones validaciones;
	@ManagedProperty(value = "#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	private List<MenuBean> listaMenu;
	private List<MenuBean> selectedMenu;
	private List<MenuBean> listaMenuPorModulo;
	private FiltrosSQLBean cadenaFiltros;
	private String tipoMantenimiento;
	private String saved;
	private String txtBuscar;

	@PostConstruct
	private void init() {
		saved="";
		tipoMantenimiento = "";
		crearFiltro();
		inicializar();
	}

	public void inicializar() {
		try {
			ListaMenuResponse response = mantenimientoMenu.mostrarListaMenu(ObtenerIdTransaccion(),cadenaFiltros);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				listaMenu = response.getListaMenu();
				listaMenuPorModulo = listaMenu;
			} else {
				System.out.println("No se encontro Data "+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}
	
	public List<MenuBean> getListaMenu() {
		return listaMenu;
	}

	public void setListaMenu(List<MenuBean> listaMenu) {
		this.listaMenu = listaMenu;
	}

	public List<MenuBean> getSelectedMenu() {
		return selectedMenu;
	}
		
	public List<MenuBean> getListaMenuPorModulo() {
		return listaMenuPorModulo;
	}

	public void setListaMenuPorModulo(List<MenuBean> listaMenuPorModulo) {
		this.listaMenuPorModulo = listaMenuPorModulo;
	}

	public void setSelectedMenu(List<MenuBean> selectedMenu) {
		this.selectedMenu = selectedMenu;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}
	
	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public FiltrosSQLBean getCadenaFiltros() {
		return cadenaFiltros;
	}

	public void setCadenaFiltros(FiltrosSQLBean cadenaFiltros) {
		this.cadenaFiltros = cadenaFiltros;
	}

	// Metodo para capturar evento de checkbox
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedMenu.size());
	}

	public void checkSelect(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedMenu.size());
	}

	public void seleccionarItem(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedMenu.size());
	}

	public void dobleSelect(SelectEvent event) {
		List<MenuBean> selected = new ArrayList<MenuBean>();
		selected.add((MenuBean) event.getObject());
		setSelectedMenu(selected);
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	public void actualizarLista() {
		setListaMenu(mantenimientoMenu.mostrarListaMenu(ObtenerIdTransaccion(),cadenaFiltros).getListaMenu());
	}

	@Override
	public void nuevoItem() {
		setSaved("");
		limpiarFormulario();
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO);
	}

	@Override
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void updateInsertItem() {
		if(tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO)){
			guardarItem();
		}
		if(tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)){
			modificarItem();
		}
	}
	public void buscarMenuPorModulo(){
		try{
			for(MenuBean ls : selectedMenu){
				System.out.println(ls.getCodModulo());
				FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
				List<Object> valores = new ArrayList<>();
				List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("me.modulo_id");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("=");
				filtro.add(listaCampo);
				filtroSQL.setListaFiltros(filtro);
				valores.add(ls.getCodModulo());
				filtroSQL.setListaValores(valores);
				setListaMenuPorModulo(mantenimientoMenu.mostrarListaMenu(ObtenerIdTransaccion(), filtroSQL).getListaMenu());
			}
		}catch(Exception e){
			System.out.println("Hubu un error al Consultar por Modulo " + e);
		}
	}
	@Override
	public void guardarItem() {
		try {
			GenericResponse response = null;
			try {
				for (MenuBean ls : listaSeleccionados(selectedMenu)) {
					response = mantenimientoMenu.nuevoMenu( ObtenerIdTransaccion(), ls);
					if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
						setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
						System.out.println("Se Registro correctamente ");
					} else {
						setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
						System.out.println("Ocurrio un error al Registrar " + response.getCodigoRespuesta() + " - "
								+ response.getMensajeRespuesta());
					}
				}
				limpiarFormulario();
				actualizarLista();
			} catch (Exception e) {
				setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
				System.out.println("Ocurrio un error al Editar en BD " + e);
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}

	@Override
	public void modificarItem() {
		try {
			GenericResponse response = null;
			try {
				for (MenuBean ls : listaSeleccionados(selectedMenu)) {
					response = mantenimientoMenu.editMenu( ObtenerIdTransaccion(), ls);
					if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
						setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
						System.out.println("Se edito correctamente ");
					} else {
						setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
						System.out.println("Ocurrio un error al Modificar " + response.getCodigoRespuesta() + " - "
								+ response.getMensajeRespuesta());
					}
				}
				actualizarLista();
			} catch (Exception e) {
				setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
				System.out.println("Ocurrio un error al Editar en BD " + e);
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}

	@Override
	public void eliminarItem() {
		try {
			GenericResponse response = null;
			try {
				for (MenuBean ls : selectedMenu) {
					response = mantenimientoMenu.deleteMenu( ObtenerIdTransaccion(), ls.getId());
					if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
						System.out.println("Se elimino Correctamente ");
					} else {
						System.out.println("Ocurrio un error al eliminar de BD "
										+ response.getCodigoRespuesta() + " - "
										+ response.getMensajeRespuesta());
					}
				}
				actualizarLista();
				opcionesControlador.desactivarControles();
			} catch (Exception e) {
				System.out.println("Ocurrio un error en BD " + e);
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}

	@Override
	public void actualizarEstado() {
		try {
			GenericResponse response = null;
			try {
				for (MenuBean bean : listaMenu) {
					response = mantenimientoMenu.editMenu(ObtenerIdTransaccion(), bean);
					if (response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)) {
						System.out.println("Se Actualizo Exitosamente");
					} else {
						System.out.println("Ocurrio un error en BD "
								+ response.getCodigoRespuesta() + " - "
								+ response.getMensajeRespuesta());
					}
				}
				actualizarLista();
			} catch (Exception e) {
				System.out.println("Ocurrio un error en BD " + e);
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error en el proceso " + e);
		}
	}
	
	public List<MenuBean> listaSeleccionados(List<MenuBean> listaRequest){
		List<MenuBean> response = new ArrayList<MenuBean>();
		for (MenuBean ls : listaRequest) {
			MenuBean menu = new MenuBean();
			menu.setId(validaciones.validarCampoInteger(ls.getId()));
			menu.setCodModulo(validaciones.validarCampoInteger(ls.getCodModulo()));
			menu.setCodMenuPadre(validaciones.validarCampoInteger(ls.getCodMenuPadre()));
			menu.setNombreMenu(validaciones.validarCamposString(ls.getNombreMenu()));
			menu.setIcon(validaciones.validarCamposString(ls.getIcon()));
			menu.setOrden(validaciones.validarCampoInteger(ls.getOrden()));
			menu.setUrl(validaciones.validarCamposString(ls.getUrl()));
			menu.setActive(ls.getActive());
			response.add(menu);
		}
		return response;
	}

	@Override
	public void limpiarFormulario() {
		List<MenuBean> listaBean = new ArrayList<MenuBean>();
		MenuBean bean = new MenuBean();
		bean.setNombreMenu("");
		listaBean.add(bean);
		setSelectedMenu(listaBean);
	}

	@Override
	public void crearFiltro() {
		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		try{
			if(getTxtBuscar() !=null && getTxtBuscar().toString().length() > 0){

				List<Object> valores = new ArrayList<>();
				List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("me.id");
				campo.add("me.modulo_id");
				campo.add("mo.nombre");
				campo.add("me.nombre");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("like");
				filtro.add(listaCampo);
				filtroSQL.setListaFiltros(filtro);
				valores.add("%"+getTxtBuscar() + "%");
				filtroSQL.setListaValores(valores);
				
			}else{
				filtroSQL.setCampoOrden("me.id");
				filtroSQL.setTipoOrden("desc");
			}
			setCadenaFiltros(filtroSQL);
			inicializar();
			opcionesControlador.habilitarControles(0);
		}catch(Exception e){
			System.out.println("Error al crear filtro " + e);
			filtroSQL.setCampoOrden("me.id");
			filtroSQL.setTipoOrden("desc");
		}
	}
}
